from core.llm import get_default_llm
import logging
import json

logger = logging.getLogger(__name__)

async def create_ppt(content: str, pages: int = 10):
    """
    根据内容生成PPT大纲
    
    Args:
        content: 内容文本
        pages: PPT页数
        
    Returns:
        dict: PPT大纲结构
    """
    try:
        # 构建PPT生成提示词
        prompt = f"""你是一个专业的PPT制作助手，请根据以下内容生成一个{pages}页的PPT大纲：

内容：
{content}

请生成一个结构清晰的PPT大纲，包括：
1. 标题页设计
2. 目录页
3. 内容页面的标题和要点
4. 总结页

要求：
- 总页数控制在{pages}页以内
- 每页内容要简洁明了
- 逻辑结构要清晰
- 适合教学使用

请用中文回答，输出格式为JSON，包含以下字段：
- title: PPT标题
- pages: 页面数组，每个页面包含：
  - page_number: 页码
  - page_title: 页面标题
  - content: 页面内容要点（数组）
  - slide_type: 页面类型（title/outline/content/summary）

请直接返回JSON格式，不要包含其他文字。
        """
        
        # 调用AI服务
        llm = get_default_llm()
        response = await llm.ainvoke(prompt)
        
        try:
            # 尝试解析JSON响应
            ppt_structure = json.loads(response.content)
            return {
                "success": True,
                "data": ppt_structure,
                "message": "PPT大纲生成成功"
            }
        except json.JSONDecodeError:
            # 如果JSON解析失败，返回文本格式
            return {
                "success": True,
                "data": {
                    "title": "教学PPT",
                    "pages": [
                        {
                            "page_number": 1,
                            "page_title": "标题页",
                            "content": ["根据内容生成的PPT"],
                            "slide_type": "title"
                        },
                        {
                            "page_number": 2,
                            "page_title": "内容大纲",
                            "content": response.content.split('\n'),
                            "slide_type": "outline"
                        }
                    ]
                },
                "message": "PPT大纲生成成功（文本格式）"
            }
        
    except Exception as e:
        logger.error(f"PPT生成失败: {e}")
        return {
            "success": False,
            "data": None,
            "message": f"PPT生成失败: {str(e)}"
        }

async def generate_ppt_content(content: str, slide_type: str = "content"):
    """
    生成PPT页面内容
    
    Args:
        content: 原始内容
        slide_type: 页面类型
        
    Returns:
        str: 生成的页面内容
    """
    try:
        # 根据页面类型构建不同的提示词
        if slide_type == "title":
            prompt = f"""请为以下内容生成一个吸引人的PPT标题页：

内容：{content}

要求：
- 标题要简洁有力
- 副标题要概括主要内容
- 适合教学使用
- 语言要专业

请直接返回标题和副标题，用换行分隔。
            """
        elif slide_type == "outline":
            prompt = f"""请为以下内容生成PPT目录页：

内容：{content}

要求：
- 列出主要章节
- 层次要清晰
- 适合教学使用
- 控制在5-8个要点

请直接返回目录要点，每行一个。
            """
        else:
            prompt = f"""请为以下内容生成PPT内容页：

内容：{content}

要求：
- 提取关键要点
- 语言要简洁
- 适合PPT展示
- 每页控制在3-5个要点

请直接返回要点内容，每行一个。
            """
        
        # 调用AI服务
        llm = get_default_llm()
        response = await llm.ainvoke(prompt)
        
        return response.content
        
    except Exception as e:
        logger.error(f"PPT内容生成失败: {e}")
        return f"内容生成失败: {str(e)}"

def format_ppt_for_export(ppt_structure: dict):
    """
    格式化PPT结构用于导出
    
    Args:
        ppt_structure: PPT结构数据
        
    Returns:
        dict: 格式化后的PPT数据
    """
    try:
        formatted_ppt = {
            "title": ppt_structure.get("title", "教学PPT"),
            "total_pages": len(ppt_structure.get("pages", [])),
            "slides": []
        }
        
        for page in ppt_structure.get("pages", []):
            slide = {
                "page_number": page.get("page_number", 1),
                "page_title": page.get("page_title", ""),
                "content": page.get("content", []),
                "slide_type": page.get("slide_type", "content")
            }
            formatted_ppt["slides"].append(slide)
        
        return formatted_ppt
        
    except Exception as e:
        logger.error(f"PPT格式化失败: {e}")
        return {
            "title": "教学PPT",
            "total_pages": 1,
            "slides": [
                {
                    "page_number": 1,
                    "page_title": "错误",
                    "content": [f"格式化失败: {str(e)}"],
                    "slide_type": "content"
                }
            ]
        } 
 
 